<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 变量提升,值提升声明不提升赋值
        // console.log(a)
        // var a = 1;
        // // 函数声明赋值和声明一起提升
        // foo()

        // function foo() {
        //     console.log('foo是一个函数')
        // }

        // 函数表达式，提升变量，不提升赋值
        // console.log(bar)
        // var bar = function() {
        //     console.log('bar是一个函数')
        // }


        // 两种都会挂载在window上
        // var a = 1;
        // b = 2
        // console.log(window.a, window.b)

        // 会挂载在window上
        // window.a = 11
        // console.log(window.a)


        // a被定义在函数内，外部不能访问，b没有var，直接赋值会被声明在window全局下
        // function test() {
        //     var a = b = 1
        //     console.log(a)
        // }
        // test()
        // console.log(a) //报错
        // console.log(b)




        // 分析在下面
        // function test(a) {
        //     console.log(a);
        //     var a = 1;
        //     console.log(a);

        //     function a() {};
        //     console.log(a)
        //     console.log(b)
        //     var b = function() {}
        //     console.log(b)
        //     console.log(c)

        //     function c() {}
        // }
        // test(2)


        // {
        //     var a // undefined

        //     function a() {}; // funciton
        //     var b // undefined

        //     function c() {} // funciton 
        //     // console.log(a); ---------------------------undefined
        //     a = 1; // 1
        //     // console.log(a); --------------------------------- 1
        //     // console.log(a)  -------------------------------- 1

        //     // console.log(b) ----------------------------------undefined
        //     b = function() {}
        //         // console.log(b) --------------------------------function 
        //         // console.log(c) ------------------------------------function
        // }


        // 分析在下面
        // var b = 3;
        // console.log(a)

        // function a(a) {
        //     console.log(a);
        //     var a = 2;
        //     console.log(a);

        //     function a() { };
        //     var b = 5;
        //     console.log(b)
        // }


        // a(1)

        // 1  var b    undefined
        // 2  b = 3    3
        // 3  function a() { }  function
        // 4  console.log(a) ----------------------- function
        // 5  a(1)
        // 6  var a    undefined 
        // 7  function a() { };  function
        // 8  var b undefined
        // 9  console.log(a); --------------------------function
        // 10 a = 2;   2
        // 11 console.log(a); -------------------------- 2
        // 12 b = 5;
        // 13 console.log(b)  -------------------5



        // 分析在下面
        // a = 1;

        // function test() {
        //     console.log(a);
        //     a = 2;
        //     console.log(a);
        //     var a = 3;
        //     console.log(a)
        // }
        // test()
        // var a


        // var a
        // function test() { }
        // a = 1;
        // test()
        // var a
        // console.log(a); undefined
        // a = 2;
        // console.log(a); 2
        // a = 3;
        // console.log(a) 3


        // 分析在下面
        // function test() {
        //     console.log(b);
        //     if (a) {
        //         // 预编译时，不会执行if，只会把var声明的提升，所以b会被提升，
        //         // 赋值等判断if后决定是否执行
        //         var b = 2
        //     }
        //     console.log(b);
        //     c = 3
        //     console.log(c)
        // }
        // var a;
        // test();
        // a = 1;
        // console.log(a)




        // function test() {}
        // var a;
        // test();
        // var b
        // console.log(b);
        // console.log(b);
        // c = 3
        // console.log(c)
        // a = 1;
        // console.log(a)



        // 分析在下面
        // a = 1;

        // function test(e) {
        //     function e() {}
        //     arguments[0] = 2; // 因为调用test(1),传了实参，所有arguments[0]改变时e就会被改变
        //     console.log(e)
        //     if (a) {
        //         var b = 3
        //     }
        //     var c;
        //     a = 4;
        //     console.log(b);
        //     f = 5;
        //     console.log(c)
        //     console.log(a)
        // }
        // var a;
        // test(1)






        //     var a;  undefined
        //     function test(e) {} function
        //     a = 1;  1
        //     test(1)  
        //     function e() {} function
        //     var b undefined
        //     var c; undefined
        //     arguments[0] = 2;
        //     console.log(e) --------------------------2  /   function 
        // ?a  b = 3    3 
        //     a = 4;   4
        //     console.log(b); ------------------ 3
        //     f = 5;
        //     console.log(c) -------------undefined
        //     console.log(a)-------------4



        // function test() {
        //     // 同一个变量var声明比函数声明提升更高， 则后执行函数声明， 返回function
        //     return a;

        //     // var a = 1

        //     function a() {}
        // }
        // console.log(test())




        // 作业
        // 找变量提升的课程


        // 重复声明，如果未赋值，则忽略，赋值则覆盖
        // var a = 1;
        // var a;
        // console.log(a)

        // 函数优先
        // foo() // 函数声明被提到我前面
        // function foo() {
        //     console.log(1)
        // }
        // var foo = function() {
        //     console.log(3)
        // }
        // function foo() {
        //     console.log(2)
        // }


        // console.log(foo)  // undefined
        // if (true) {
        //     // 如果没有函数定义，上面会报错 ReferenceError
        //     // 编译阶段进行了提升
        //     function foo() {
        //         console.log(22)
        //     }
        // }
    </script>
    <script>
        // console.log(fun);
        // console.log(person);
    </script>
    <script>
        // console.log(person);
        // console.log(fun);
        // var person = "Eric";
        // console.log(person);
        // function fun() {
        //     console.log(person);
        //     var person = "Tom";
        //     console.log(person);
        // }
        // fun();
        // console.log(person)


        function foo() {
            var str = '3123123';
            function f() {
                return str;
            }
            return f
        }
        // console.log(foo()())

        const a = foo();
        console.log(a())
        
    </script>
</body>

</html>